package java学习.第12章_集合框架;

import org.junit.Test;

import java.time.LocalDate;
import java.util.*;

/**
 * Collection
 * ➢Collection接口:单列数据，定义了存取一组对象的方法的集合
 *      List接口:元素有序、可重复的集合  --》"动态"数组
 *              方法：ArrayList、LinkedList、Vector
 *      Set接口:元素无序、不可重复的集合
 *              方法：HashSet、LinkedHashSet、TreeSet
 */
public class B1_Collection {

    /**
     * add(E e):添加元素
     * addAll(Collection<? extends E> c) :将整个集合添加进去
     * clear()   清空集合元素
     * isEmpty() 判断是否为空
     */
    @Test
    public void 基本方法1() {
        Collection coll = new ArrayList();
        //集合添加
        coll.add("AA");coll.add('v');
        coll.add(123);coll.add(15.6);coll.add(new Date());

        System.out.println(coll.size());//5   个数
        coll.addAll(coll);//添加一个和自己同类型的所有
        System.out.println(coll.size());//10    个数

        System.out.println(coll);
        coll.clear();//清空集合元素
        System.out.println(coll);//[]
        System.out.println(coll.isEmpty());//判断是否为空
    }


    /**
     * contains(Object o)：判断是否有此内容
     * containsAll(Collection<?> c):判断是否包含所有元素 都有的话为 true
     * 向Collection 接口的实现类的对象中添加数据obj时，
     * 要求obj所在类要重写equals()方法
     * contains() 方法要用 equals 方法判断
     * remove(Object o):  删除指定元素  true :找到了并删除  false：未找到
     * removeAll(Collection<?> c)： 删除 此集合的元素 在 c 中出现的所有元素
     * retainAll(Collection<?> c) :保留 此集合 中的元素 在 c 中出现的所有元素
     */
    @Test
    public void 与要重写equals方法() {
        Collection coll = new ArrayList();
        coll.add("AA");coll.add('v');coll.add(123);
        coll.add(15.6);coll.add(LocalDate.now());coll.add(123);

        //用的是equals方法判断   判断coll是否有此内容
        System.out.println(coll.contains("123"));//false   判断coll是否有此内容
        System.out.println(coll.contains(123));//true    判断coll是否有此内容
        System.out.println(coll.containsAll(coll));//判断是否包含所有元素 都有的话为 true

        System.out.println("*********删除指定元素*************差集**************");
        System.out.println(coll);//[AA, v, 123, 15.6, 2023-03-30, 123]
        System.out.println(coll.remove(123));//true  删除指定元素 只删除最近一个
        System.out.println(coll.remove(46563));//false  未找到删除指定元素
        System.out.println(coll);//[AA, v, 15.6, 2023-03-30, 123]
        Collection coll1 = Arrays.asList('v', "aa", 123);//差集
        coll.add(123);
        //true 删除所有coll里coll1有的元素 只要有删除的就是true
        System.out.println(coll.removeAll(coll1));
        // 发现两个 123 都没了，是因为  底层逻辑是  创了一个新数组，
        // for 循环当 coll的元素能在coll1中找 不到，添加
        System.out.println(coll);//[AA, 15.6, 2023-03-30]

        System.out.println("*********交集*****************");
        Collection coll2 = Arrays.asList("AA", "aa", 123);
        coll.add("AA");
        System.out.println(coll.retainAll(coll2));//交集  只要改变了coll就为true
        //底层 创了一个新数组  coll 里的元素 在coll2中 存在/找到，就会添加
        System.out.println(coll);//[AA, AA]

        coll.equals(coll);//比较元素是否都相等  list  有序   顺序不对也是false  set无徐无关顺序

    }


    /**
     * int hashCode()：返回当前对象的哈希值
     * toArray()：//集合--》数组
     * Arrays.asList(数组)：//数组--》集合
     */
    @Test
    public void 数组集合的转换() {
        Collection coll = new ArrayList();
        coll.add("AA");coll.add('v');coll.add(123);
        coll.add(15.6);coll.add(new Date());


        System.out.println(coll.hashCode());//返回当前对象的哈希值
        System.out.println("********集合--》数组*******************");
        Object[] obj = coll.toArray();//集合--》数组
        for (Object o : obj) {
            System.out.println(o);
        }

        System.out.println("********数组--》集合*******************");
        Collection a = Arrays.asList(obj);//数组--》集合
        System.out.println(a);

        Collection coll1 = Arrays.asList(new int[]{1336, 545});
        System.out.println(coll1);//返回的是地址 如果是基本数据类型   它认为只有一个元素
        Collection coll2 = Arrays.asList(new Integer[]{1336, 545});
        System.out.println(coll2);//包装后  就可以了
        Collection coll3 = Arrays.asList(122,33,55,699);
        System.out.println(coll3);//[122, 33, 55, 699]
    }


    /**
     * 使用Iterator接口遍历集合元素
     * ●Iterator对象称为迭代器(设计模式的一种)， 主要用于遍历Collection集合中的元素。
     * ●GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素，
     * 而又不需暴露该对象的内部细节。迭代器模式，就是为容器而生。
     * 类似于“公交车上的售票员”、“火车上的乘务员”、“空姐”
     * ●Collection接口继承了java.lang.Iterable接口，该接口有一个iterator()方法，
     * 那么所有实现了Collection接口的集合类都有一个iterator()方法，
     * 用以返回一个实现了Iterator接口的对象。
     * ●Iterator 仅用于遍历集合，Iterator 本身并不提供承装对象的能力。
     * 如果需要创建Iterator对象，则必须有一个被迭代的集合。
     * ●集合对象每次调用iterator()方法都得到一个全新的迭代器对象，
     * 默认游标都在集合的第一个元素之前。
     * ●Iterator内部定义了remove(),可以在遍历的时候，删除集合中的元素。
     *  此方法不同于集直接调用remove()
     */
    @Test
    public void Iterator迭代器遍历() {

        Collection coll = new ArrayList();
        coll.add("AA");coll.add('v');
        coll.add(123);coll.add(15.6);

        System.out.println("-----------1-------------------------");
        Iterator iterator = coll.iterator();//指针指向的是  第一个元素的上一个位置
        System.out.println(iterator.next());
        System.out.println(iterator.next());
        System.out.println(iterator.next());
        System.out.println(iterator.next());
//        System.out.println(iterator.next());//java.util.NoSuchElementException

        System.out.println("-----------2-------------------------");
        Iterator iterator2 = coll.iterator();//指针指向的是  第一个元素的上一个位置

        //hasNext():判断是否还有下一个元素
        while (iterator2.hasNext()) {//是否还有元素
            //next():①指针下移 ②将下移以后集合位置上的元素返回
            //源码是  先保存当前位置 0  ，当前位置+1  返回原来的位置 0 的元素
//            System.out.println(iterator.next());//返回集合元素
            Object obj = iterator2.next();
            Integer a = 123;
            if (a.equals(obj)) {//删除123这个元素
                iterator2.remove();//删除当前指针指向的元素  不能连续remove两次  删没了 就没了
                // 不能刚开始就用  因为指针最开始指向的是  第一个元素的上一个位置 没有元素报异常
            }

        }
        System.out.println(coll);

        System.out.println("-----------2-------------------------");

        iterator = coll.iterator();
        while (iterator.hasNext()) {//是否还有元素
            System.out.println(iterator.next());//返回集合元素
        }
    }

    /**
     * foreach
     * 遍历集合
     * //内部调用的也是迭代器
     *
     */
    @Test
    public void foreach增强for循环() {

        Collection coll = new ArrayList();
        coll.add("AA");//集合添加
        coll.add('v');
        coll.add(123);
        coll.add(15.6);

        for (Object o : coll) {//内部调用的也是迭代器
            System.out.println(o);
        }
        coll.forEach(System.out::println);//同上  也是遍历 JKD8新特性
    }

}
